#include <iostream> //i:input o:output.  stream:流
// 命令空间 todo...
using namespace std;
#include <string>
#include <cstring>
#include <stdlib.h>

#define BUFFERL_SIZE 128

/*
    在c++中. struct和class是完全一样的,除了权限问题.
         在struct里面，默认权限是public(开放)的
        在class里面，默认权限是private(私有)的
*/

struct Person
{
    int age;
    char sex;
    char name[20];
};

class Student
{
public:
    int age;
    char sex;
    char name[20];
};

// 函数重载
// 函数重载的三种方式
//    1,函数参数个数的不同
//    2,函数参数的类型不同
//    3,函数参数的顺序不同
//     4,const修饰的也可以构成重载
//   函数的返回值 并不能实现函数重载.

int myAdd(int val1, int val2)
{
    cout << "myAdd(int val1,int val2)" << endl;
    return val1 + val2;
}

float myAdd(float val1, float val2)
{
    cout << "myAdd(float val1,float val2)" << endl;
    return val1 + val2;
}

int getMin(int num1, int num2)
{
    return num1 > num2 ? num1 : num2;
}

// 内连函数
// 好处:调用速度快，本:替换函数本体到调用者的地方
// 减少函数的切换
// 用法:短而精
inline int getmax(int num1, int num2)
{
    return num1 > num2 ? num1 : num2;
}

void swapVal01(int *val1, int *val2) // 交换两个数
{
    int temp = *val1;
    *val1 = *val2;
    *val2 = temp;
}

//引用 c++里面引用也会改变实参的值。
//如果强制不给修改,就需要在函数参数中加上const.
void swapVal02(int & val1, int & val2) // 交换两个数
{
    // cout << "size of val1:" << sizeof(val1) << endl;
    // cout << "size of val2:" << sizeof(val2) << endl;
    int temp = val1;
    val1 = val2;
    val2 = temp;
}

// 命令行参数
int main(int argc, char *argv[])
{
#if 0
    // 区别1:输入输出
    // 输入使用的是cin
    // 输出使用的是cout
    // cout<< endl;是换行的意思

    // 输入
    int choice = 0;
    cout << "请输入你的选择:" << endl;
    cin >> choice;

    // 输出
    cout << "choice:" << choice << endl;
    cout << "hello word" << endl;
#endif

#if 0
    // 字符串
    const char *str1 = "iuguy";
    //*str1 = 'M';
    str1 = "hello 271";
    /*总结:const的位置决定了变量或者指针的属性
        1.const char * str ="666"
        因为const在*str的前面，*str不能变, 但是str能改变.
        2.char * const str ="777";
        因为const在str的前面，说明str不能变, 但是*str能变.
        但是最后还是要看后面的地址的存储位置是否在全局常量区
    */

#endif

#if 0
    // c++里面的字符串

    string str1 = "zhangsan";
    string str2 = "lisi";
    //stringt的> < == 操作可以替换stecmp字符串函数
    // 判断是否相等
    if (str1 == str2)
    {
        cout << "相等" << endl;
    }
    else
    {
        cout << "不相等" << endl;
    }
    //
    // 判断大小
    if (str1 > str2)
    {
        cout << "str1大" << endl;
    }
    else
    {
        cout << "str2大" << endl;
    }
    //
    // string的 + 操作可以替换strcat字符串函数。
    str1 = str1 + str2;
    cout << "str1:" << str1 << endl;
    //
    // string的 =(赋值)操作可以替换strcpy字符串函数。
    str1 = str2;
    cout << "str1:" << str1 << endl;
    //
    // string的length函数 可以替换strlen字符串函数
    cout << "length:" << str1.length() << endl;
#endif

#if 0

    // cout << "argc:" << argc << endl;

    // for (int i = 0; i < argc; i++)
    // {
    //     cout << argv[i] << endl;
    // }

    cout << "size of Person:" << sizeof(Person) << endl;
    cout << "size of student:" << sizeof(Student) << endl;

    Person p1;
    p1.age = 22;
    strcpy(p1.name, "zhangsan");
    p1.sex = 'm';

    printf("name = %s, age =%d, sex = %c\n", p1.name, p1.age, p1.sex);
    cout<<"name:"<<p1.name<<",age:"<<p1.age<<",sex:"<<p1.sex<<endl;



    Student s1;
    s1.age = 23;
    s1.sex='f';
    strcpy(s1.name, "lisi");
    cout<<"name:"<<s1.name<<",age:"<<s1.age<<",sex:"<<s1.sex<<endl;

#endif

#if 0

    // new 和 delete & malloc() 和 free().
    /*
        C语言:    malloc()和free()是函数
        C++语言:  new 和 delete -关键字
    */
    char *str = (char *)malloc(sizeof(char) * BUFFERL_SIZE);
    if (str == NULL)
    {
        cout << "malloc error." << endl;
        exit(-1);
    }
    free((void *)str);

    char * str2 = new char[BUFFERL_SIZE];
    if(str2 == NULL)
    {
        cout<< "new error."<< endl;
        exit(-1);
    }
    delete[]str2;   //释放空间
   //todo.. new会主动报错(抛异常.)

#endif

#if 0
    //函数重载
        //C++能实现函数重载的本质就是汇编
    int num1 = 10;
    int num2 = 66;
    myAdd(num1, num2);
#endif

#if 0
    int num1 = 100;
    int num2 = 200;
    int minVal = getMin(num1, num2);

    /*内联函数 */
    // int maxVal = getMax(num1, num2);

    // 内联函数的本质是:替换函数的调用。直接将函数的实现覆盖函数调用.
    //int maxVal = (num1 > num2) ? num1 : num2 ;
#endif

#if 1
    int num1 = 100;
    int num2 = 200;

    swapVal02(num1, num2);

    cout << "num1:" << num1 << endl;
    cout << "num2:" << num2 << endl;

#endif












    return 0;
}